; 编写一个返回四字节（32位）无符号整数的十进制数串的例程，
; 整数通过寄存器EAX传入，返回的字符串缓冲区地址为[ES:BP]，
; 串长（字符个数）在CX中（便于使用显示中断INT 10h的13h号
; 功能来显示整数字符串）
    org 0100h
    mov ax, cs
    mov es, ax
    mov ds, ax
    mov ss, ax	; 设置堆栈指针
    mov sp, 100h - 4
	mov eax, 0fedcba98h ;4275878552(10)
    call GetDigStr
	call PrintNum
    mov ax,4c00h    ; AH=4Ch（功能号，终止进程）、AL=0（返回代码）
    int 21h         ; DOS软中断

GetDigStr: ; 以EAX为传递参数，[串地址]BP和[字符个数]CX为返回值
	mov cx, 1			; 位数=1（初值）
	mov bp, sbuf		; BP = sbuf + dn - 1 = sbuf的当前位置
	add bp, dn - 1
	mov bx,10		; 除数=10
DLoop: ; 循环开始处
	mov edx, 0		; EDX=0
	div ebx			; eax ← edx:eax/源 的商、edx ← edx:eax/源 的余数
	add dl, 30h		; 余数 + 30h = 对应的数字符ASCII码
	mov [bp], dl		; sbuf[BP] = DL
	cmp eax, 0			; 商AX = 0 ?
	je OutLoop		; = 0 跳出循环
	inc cx			; 位数CX++
	dec bp			; 数字符的当前位置BP--
	jmp DLoop		; 继续循环
OutLoop: ; 退出循环
	ret				; 从例程返回

PrintNum:
	mov ah, 13H ; 功能号
	mov al, 1 ; 光标方式（光标放到串尾）
	mov bl, 0dh ; 背景与前景色（如0cH=00001100为黑底亮红字，0fH=00001111为黑底亮白字）
	mov bh, 0 ; 显示页号（第0页）
	mov dh, 24 ; 行号
	mov dl, 0 ; 列号
	; mov es, 字符串段地址
	; mov bp, 字符串偏移地址
	; mov cx, 串长
	int 10H ; 调用中断
	ret

dn equ 1000000000h ; 最大位数
sbuf db dn ; 用于存放十进制数字串的缓冲区

